import { Injectable } from '@nestjs/common';
import OSS from 'ali-oss';
import config from '../../../config';

@Injectable()
export class OssService {
  private client: OSS;
  constructor() {
    this.client = new OSS(config.ossConfig);
  }

  /**
   * 上传文件到 OSS
   * @param filePath 文件路径
   * @param savePath OSS 存储路径
   * @param isPublic 是否公共
   * @returns 上传结果
   */
  async uploadFile(
    filePath: string,
    savePath: string,
    isPublic: boolean,
  ): Promise<OSS.PutObjectResult> {
    try {
      const uploadResult = await this.client.put(savePath, filePath);

      // 设置权限: 公共读（public-read）或私有（private）
      const acl = isPublic ? 'public-read' : 'private';
      await this.client.putACL(savePath, acl);
      console.log(
        `文件 ${savePath} 的上传和权限配置已完成，当前权限为: ${acl}`,
      );
      return uploadResult;
    } catch (error) {
      // 处理异常
      console.error('上传文件失败：', error);
      throw new Error('文件上传失败');
    }
  }

  /**
   * 下载文件从 OSS
   * @param ossFilePath OSS 文件路径
   * @param localFilePath 本地存储路径
   * @returns 下载结果
   */
  async downloadFile(
    ossFilePath: string,
    localFilePath: string,
  ): Promise<OSS.GetObjectResult> {
    try {
      return await this.client.get(ossFilePath, localFilePath);
    } catch (error) {
      // 处理异常
      console.error('下载文件失败：', error);
      throw new Error('文件下载失败');
    }
  }

  /**
   * 删除 OSS 中的文件
   * @param ossFilePath OSS 文件路径
   * @returns 删除结果
   */
  async deleteFile(ossFilePath: string): Promise<OSS.DeleteResult> {
    try {
      return await this.client.delete(ossFilePath);
    } catch (error) {
      // 处理异常
      console.error('删除文件失败：', error);
      throw new Error('文件删除失败');
    }
  }

  /**
   * 获取文件的OSS访问URL
   * @param ossFilePath OSS 文件路径
   * @returns 访问 URL
   */
  generateFileUrl(ossFilePath: string): string {
    try {
      // URL 有效期1小时
      return this.client.signatureUrl(ossFilePath, { expires: 3600 });
    } catch (error) {
      // 处理异常
      console.error('生成文件 URL 失败：', error);
      throw new Error('生成文件 URL 失败');
    }
  }

  /**
   * 获取公共文件的直接访问 URL
   * @param ossFilePath OSS 文件路径
   * @returns 公共 URL
   */
  getPublicFileUrl(ossFilePath: string): string {
    return `https://${config.ossConfig.bucket}.${config.ossConfig.region}.aliyuncs.com/${ossFilePath}`;
  }
}
